package com.xzzz.irda.auth.core.constants;

import cn.hutool.core.util.StrUtil;
import com.xzzz.irda.auth.core.authorization.*;

/**
 * 验证方式
 *
 * @author wangyf
 * 
 */
public enum GrantTypeEnum {

    /**
     * 内部登录方式
     */
    INNER("inner", AuthorizationInner.class,"内部登录, 接收特殊的 [ClientId], 外部无法使用"),
    /**
     * 密码验证方式
     */
    PASSWORD("password", AuthorizationPassword.class,"密码登录, 需要传入用户名和密码"),
    /**
     * 手机号验证方式
     */
    PHONE("phone", AuthorizationPhone.class,"手机号登录, 需要传入手机号和验证码"),
    /**
     * 微信OPENID登录
     */
    WECHAT("wechat", AuthorizationWx.class,"微信登录, 需要传入微信CODE"),
    ;

    private final String type;
    private final Class<? extends Authorization> authorizationClass;
    private String desc;

    GrantTypeEnum(String type, Class<? extends Authorization> authorizationClass, String desc) {
        this.type = type;
        this.authorizationClass = authorizationClass;
    }

    public String getType() {
        return type;
    }

    public Class<? extends Authorization> getAuthorizationClass() {
        return authorizationClass;
    }

    public String getDesc() {
        return desc;
    }

    /**
     * 校验授权方式是否存在
     *
     * @param type 授权方式字符串
     * @return 存在:true,不存在:false
     */
    public static boolean valid(String type) {
        if (StrUtil.isBlank(type)) {
            return false;
        }
        type = type.toLowerCase();
        for (GrantTypeEnum value : GrantTypeEnum.values()) {
            if (value.getType().equals(type)) {
                return true;
            }
        }
        return false;
    }

    public static GrantTypeEnum getGrantType(String type) {
        for (GrantTypeEnum value : GrantTypeEnum.values()) {
            if (value.getType().equals(type)) {
                return value;
            }
        }
        return null;
    }

    /**
     * 根据授权类型字符串获取授权对象
     *
     * @param grantType 授权类型
     * @return 不同授权方式的授权对象
     */
    public static Class<? extends Authorization> getAuthorizationClass(String grantType) {
        for (GrantTypeEnum value : GrantTypeEnum.values()) {
            if (value.type.equals(grantType)) {
                return value.authorizationClass;
            }
        }
        return null;
    }
}
